import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class 线程复用与脏数据泄露
{

    // 任务接口
    interface Task {
        void run();
    }

    // 模拟线程内部保存的上下文（状态）
    static class WorkerThread extends Thread {
        private final BlockingQueue<Task> taskQueue;
        private String currentUser; // 线程状态，未清理会造成泄漏
        ThreadLocal<Long> threadLocal=new ThreadLocal<>();//用户ID。演示ThreadLocal可能出现脏数据泄露

        public WorkerThread(BlockingQueue<Task> taskQueue) {
            this.taskQueue = taskQueue;
        }

        @Override
        public void run() {
            try {
                while (true) {
                    Task task = taskQueue.take(); // 阻塞等待任务
                    task.run(); // 执行任务
                }
            } catch (InterruptedException e) {
                System.out.println("Worker exit.");
            }
        }

        public void setCurrentUser(String user) {
            this.currentUser = user;
        }

        public String getCurrentUser() {
            return currentUser;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Task> queue = new LinkedBlockingQueue<>();
        WorkerThread worker = new WorkerThread(queue);
        worker.start();

        // 第一个任务
        queue.put(() -> {
            worker.setCurrentUser("Alice");
            worker.threadLocal.set(20031210201L);
            System.out.println("任务1执行 -> 当前用户: " + worker.getCurrentUser()+",用户ID："+worker.threadLocal.get());
            // ❌ 故意不清理 currentUser
            //worker.setCurrentUser(null); // ✅ 清理
            //worker.threadLocal.remove();// ✅ 清理
        });

        Thread.sleep(500);

        // 第二个任务
        queue.put(() -> {//和第一个任务运行再同一个线程worker
            System.out.println("任务2执行 -> 当前用户: " + worker.getCurrentUser()+",用户ID："+worker.threadLocal.get());
            // 期望为 null，但输出可能是 "Alice"
        });

        Thread.sleep(500);
        worker.interrupt(); // 结束线程
    }
}
